home *** CD-ROM | disk | FTP | other *** search
/ C/C++ Users Group Library 1996 July / C-C++ Users Group Library July 1996.iso / vol_400 / 422_02 / misc / bj.c < prev    next >
C/C++ Source or Header  |  1994-03-20  |  2KB  |  91 lines

  1. /*
  2.  * Very simple BLACKJACK (21) game
  3.  *
  4.  * Compile command: cc bj -fop
  5.  */
  6. #include <stdio.h>
  7. #define    DECK    52
  8. #define    SUITES    4
  9.  
  10. extern int RAND_SEED;
  11.  
  12. main()
  13. {
  14.     int deck[DECK], i, j, t, player_total, dealer_total, next_card;
  15.  
  16.     player_total = dealer_total = next_card = 0;
  17.  
  18.     /* Initialize random seed */
  19.     get_time(&i, &j, &t);
  20.     RAND_SEED = (i*3600) + (j*60) + t;
  21.  
  22.     /* Deal a deck of cards */
  23.     for(i=0; i < DECK; ++i)
  24.         deck[i] = i;
  25.     for(i=0; i < DECK; ++i) {
  26.         t = deck[i];
  27.         deck[i] = deck[j = rand(DECK)];
  28.         deck[j] = t; }
  29.  
  30.     /* Accept player cards */
  31.     for(;;) {
  32.         printf("Player: %-4u", player_total);
  33.         if(player_total > 21)
  34.             abort("You BUST!");
  35.         if(get_input("Another card (Y/N)", "YN") == 'N')
  36.             break;
  37.         show_card(i = deck[next_card++]);
  38.         if(!(i %= (DECK/SUITES))) {
  39.             if(get_input("1 or Ten?", "1T") == 'T')
  40.                 i = 9; }
  41.         player_total += (i > 9) ? 10 : i+1; }
  42.  
  43.     /* Play dealer */
  44.     for(;;) {
  45.         printf("Dealer: %-4u", dealer_total);
  46.         if(dealer_total > 21)
  47.             abort("You WIN!");
  48.         if(dealer_total >= player_total)
  49.             abort("Dealer wins!");
  50.         show_card(i = deck[next_card++]);
  51.         if(!(i %= (DECK/SUITES))) {
  52.             t = dealer_total + 10;
  53.             if((t < 22) && ((t >= player_total) || (t < 10)))
  54.                 i = 9;
  55.             printf("Dealer choses: %u\n", i+1); }
  56.         dealer_total += (i > 9) ? 10 : i+1; }
  57. }
  58.  
  59. /*
  60.  * Get input character with prompt, and validate
  61.  */
  62. get_input(prompt, allowed)
  63.     char prompt[], allowed[];
  64. {
  65.     int i;
  66.     char buffer[50], *ptr, c;
  67.  
  68.     for(;;) {
  69.         printf("%s?", prompt);
  70.         fgets(ptr = buffer, sizeof(buffer)-1, stdin);
  71.         while(isspace(c = toupper(*ptr)))
  72.             ++ptr;
  73.         for(i = 0; allowed[i]; ++i)
  74.             if(c == allowed[i])
  75.                 return c;
  76.         printf("Huh?\n"); }
  77. }
  78.  
  79. /*
  80.  * Display a card
  81.  */
  82. show_card(card)
  83.     int card;
  84. {
  85.     static char *suites[] = { "Hearts", "Diamonds", "Clubs", "Spades" };
  86.     static char *cards[] = { "Ace", "Two", "Three", "Four", "Five", "Six",
  87.         "Seven", "Eight", "Nine", "Ten", "Jack", "Queen", "King" };
  88.  
  89.     printf("%s of %s\n", cards[card % (DECK/SUITES)], suites[card / (DECK/SUITES)]);
  90. }
  91.